package com.zenithmind.library.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.library.pojo.domain.FineRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 罚金记录Mapper接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
@Mapper
public interface FineRecordMapper extends BaseMapper<FineRecord> {

    /**
     * 分页查询罚金记录
     * 
     * @param page 分页参数
     * @param userId 用户ID
     * @param fineType 罚金类型
     * @param paymentStatus 支付状态
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 分页结果
     */
    IPage<FineRecord> selectFineRecordPage(Page<FineRecord> page,
                                          @Param("userId") String userId,
                                          @Param("fineType") Integer fineType,
                                          @Param("paymentStatus") Integer paymentStatus,
                                          @Param("startDate") LocalDate startDate,
                                          @Param("endDate") LocalDate endDate);

    /**
     * 根据用户ID查询罚金记录
     * 
     * @param userId 用户ID
     * @return 罚金记录列表
     */
    List<FineRecord> selectByUserId(@Param("userId") String userId);

    /**
     * 根据借阅记录ID查询罚金记录
     * 
     * @param borrowRecordId 借阅记录ID
     * @return 罚金记录列表
     */
    List<FineRecord> selectByBorrowRecordId(@Param("borrowRecordId") String borrowRecordId);

    /**
     * 统计用户未支付罚金总额
     * 
     * @param userId 用户ID
     * @return 未支付罚金总额
     */
    BigDecimal sumUnpaidFinesByUser(@Param("userId") String userId);

    /**
     * 统计用户已支付罚金总额
     * 
     * @param userId 用户ID
     * @return 已支付罚金总额
     */
    BigDecimal sumPaidFinesByUser(@Param("userId") String userId);

    /**
     * 更新支付状态
     * 
     * @param id 罚金记录ID
     * @param paymentStatus 支付状态
     * @param paidAmount 已支付金额
     * @param paymentMethod 支付方式
     * @param paymentReference 支付凭证号
     * @return 更新行数
     */
    int updatePaymentStatus(@Param("id") String id,
                           @Param("paymentStatus") Integer paymentStatus,
                           @Param("paidAmount") BigDecimal paidAmount,
                           @Param("paymentMethod") String paymentMethod,
                           @Param("paymentReference") String paymentReference);

    /**
     * 批量更新支付状态
     * 
     * @param ids 罚金记录ID列表
     * @param paymentStatus 支付状态
     * @return 更新行数
     */
    int batchUpdatePaymentStatus(@Param("ids") List<String> ids, @Param("paymentStatus") Integer paymentStatus);

    /**
     * 统计罚金记录数量
     * 
     * @param fineType 罚金类型
     * @param paymentStatus 支付状态
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 记录数量
     */
    Long countFineRecords(@Param("fineType") Integer fineType,
                         @Param("paymentStatus") Integer paymentStatus,
                         @Param("startDate") LocalDate startDate,
                         @Param("endDate") LocalDate endDate);

    /**
     * 统计罚金总额
     * 
     * @param fineType 罚金类型
     * @param paymentStatus 支付状态
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 罚金总额
     */
    BigDecimal sumFineAmount(@Param("fineType") Integer fineType,
                            @Param("paymentStatus") Integer paymentStatus,
                            @Param("startDate") LocalDate startDate,
                            @Param("endDate") LocalDate endDate);
}
